package com.example.prison.webSocket;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@ServerEndpoint("/api/myWebSocket") // 接口路径 ws://localhost:8040/api/myWebSocket
@Component
public class WsServerEndpoint {

    private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<>());

    // ConcurrentHashMap 和hashMap的区别是 ConcurrentHashMap是线程安全的
    public static Map<String,Session> sessionMap = new ConcurrentHashMap<>();

    /**
     * 连接成功
     * websocket建立链接时触发方法
     * @param session
     */
    @OnOpen
//    public void onOpen(Session session, @PathParam("userId") String userId) {
//        log.info("WebSocket连接成功");
//        // 建立连接时，将session存入map中 使用用户ID作为sessionMap的key
//        sessionMap.put(userId,session);
//    }
    public void onOpen(Session session) {
        System.out.println("WebSocket连接成功");
        // 建立连接时，将session存入map中 使用用户ID作为sessionMap的key
        sessionMap.put("onOpen",session);
    }

    /**
     * 连接关闭
     * @param session
     */
    @OnClose
//    public void onClose(Session session, @PathParam("userId") String userId) {
//        log.info("WebSocket连接关闭");
//        sessionMap.remove(userId);
//    }
    public void onClose(Session session) {
        System.out.println("WebSocket连接关闭");
        sessionMap.remove("onOpen");
    }

    /**
     * 收到了客户端消息时触发方法
     * @param text 客户端传来的消息内容
     * @return java.lang.String
     **/
    @OnMessage
//    public String onMsg(String text) throws IOException {
//        log.info("server 发送：" + text);
//        return text;
//    }
    public String onMessage(String text){
        return null;
    }

    /**
     * 发送错误时的处理
     * @param error Throwable
     */
    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
    }


    /**
     * 发送消息
     * @author liukang
     * @date 15:49 2024/5/24
     * @param message
     **/
    public static void sendMessage(String message) throws IOException {
        Session session = sessionMap.get("onOpen");
        RemoteEndpoint.Basic basicRemote = session.getBasicRemote();
        ObjectMapper mapper = new ObjectMapper();
        String msgStr = mapper.writeValueAsString(message);
        System.out.println("server 发送：" + msgStr);
        basicRemote.sendText(msgStr);
    }

}

